% $File: report.tex
% $Date: Fri Jan 31 21:26:14 2014 +0800
% $Author: jiakai <jia.kai66@gmail.com>

\documentclass[a4paper]{article}
\usepackage{amsmath,amssymb,amsthm,fontspec,zhspacing,verbatim,graphicx,minted}
\usepackage[hyperfootnotes=false,colorlinks,linkcolor=black,anchorcolor=black,citecolor=black]{hyperref}
\usepackage[top=2in, bottom=1.5in, left=1in, right=1in]{geometry}

\newcommand{\addplot}[1]{\begin{center}
	\includegraphics[width=0.6\paperwidth]{#1}
\end{center}}

% \textref{marker}{text}
\newcommand{\textref}[2]{\hyperref[#1]{#2}}
\newcommand{\figref}[1]{\hyperref[fig:#1]{Figure~\ref*{fig:#1}}}
\newcommand{\eqnref}[1]{\hyperref[eqn:#1]{(\ref*{eqn:#1})}}
\newcommand{\lemref}[1]{\hyperref[lemma:#1]{Lemma~\ref*{lemma:#1}}}


\zhspacing

\title{编译原理拓展实验报告}
\author{清华大学\\贾开~周昕宇~李铁铮}
\date{\today}

\begin{document}
\maketitle

\tableofcontents

\section{实验目的}
修改decaf java实现，使得它能编译出可在计算机组成原理课上设计的CPU以及ucore操作系
统环境下运行的代码。

\section{实验环境}
\begin{enumerate}
	\item 目标CPU是自行设计的流水CPU，采用简化的MIPS32指令集，
		支持基本算术、流程控制指令，有TLB及异常和中断的处理。
	\item 目标操作系统是ucore，是一个简单的类unix操作系统，
		实现了简单的I/O及进程调度的系统调用，可以在上述CPU上运行。
	\item decaf编译器使用java实现，其完整实现已由老师给出，
		可以把decaf源程序编译成MIPS32汇编代码。
\end{enumerate}


\section{实验方案}
\input{method.tex}


\section{实现细节}
该项目所有代码都在\url{https://git.net9.org/armcpu-devteam/armcpu/tree/master}
上，与decaf相关的部分是/decaf及/ucore/ours/decaf。

\subsection{对decaf编译器的修改}
对decaf编译器的修改以diff形式显示如下，注意其中将add、sub改成了addu、subu，
以及\verb|main|被重命名为\verb|decaf_main|。
\inputminted[linenos,fontsize=\small,tabsize=4]{diff}{../decaf.diff}


\subsection{库函数调用转发及程序入口}
我们实现了以下的汇编程序，用于对库函数调用的转发，
同时注意其中main是程序的入口点。
\inputminted[linenos,fontsize=\small,tabsize=4]{nasm}{../entry.s}

\subsection{库调用的实现}
decaf中有Alloc, ReadInteger, PrintString等函数调用作为语言的内建函数，
可以以保留字的形式直接调用。对此，我们在c中实现了用到的几个函数，具体如下：
\inputminted[linenos,fontsize=\small,tabsize=4]{c}{../userlib.c}


\section{实验效果}
我们成功编译并运行了以下程序，它读入一个整数$N$，
输出$N$个盘子的汉诺塔移动方案。该程序说明了库函数调用、程序入口及退出以及基于
decaf本身calling convention的递归调用的实现的正确性。
\inputminted[linenos,fontsize=\small,tabsize=4]{java}{../hanoi.decaf}

\end{document}

% vim: filetype=tex foldmethod=marker foldmarker=f{{{,f}}}

